/*-------------------------------------------------------------------------
 *
 * spin.h
 *	   硬件无关的自旋锁实现。
 *
 *
 *	自旋锁的硬件无关接口由 typedef "slock_t" 和这些宏定义：
 *
 *	void SpinLockInit(volatile slock_t *lock)
 *		初始化自旋锁（处于未锁定状态）。
 *
 *	void SpinLockAcquire(volatile slock_t *lock)
 *		获取自旋锁，如有必要则等待。
 *		如果在“合理”的时间内无法获取锁，请超时并 abort() —— 通常约 1 分钟。
 *
 *	void SpinLockRelease(volatile slock_t *lock)
 *		解锁先前获取的锁。
 *
 *	bool SpinLockFree(slock_t *lock)
 *		测试锁是否空闲。如果空闲则返回 true，如果已锁定则返回 false。
 *		这并不会改变锁的状态。
 *
 *	调用者必须注意，宏参数可能会被多次求值！
 *
 *	调用代码中的加载和存储操作保证与这些操作不会重新排序，
 *	因为它们包括一个编译器屏障。  (在 PostgreSQL 9.5 之前，调用者需要使用
 *	volatile 限定符来访问有效自旋锁保护的数据。)
 *
 *	请记住自旋锁的编码规则，即自旋锁不得被持有超过几个指令。
 *	特别是，我们假设在持有自旋锁时无法发生 CHECK_FOR_INTERRUPTS()，
 *	因此在这些宏中不需要执行 HOLD/RESUME_INTERRUPTS()。
 *
 *	这些宏是通过 s_lock.h 提供的硬件相关宏实现的。
 *	目前此头文件没有添加额外功能，但过去曾有过，将来可能还会再次添加。
 *
 *
 * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 * src/include/storage/spin.h
 *
 *-------------------------------------------------------------------------
 */
#ifndef SPIN_H
#define SPIN_H

#include "storage/s_lock.h"
#ifndef HAVE_SPINLOCKS
#include "storage/pg_sema.h"
#endif


#define SpinLockInit(lock)	S_INIT_LOCK(lock)

#define SpinLockAcquire(lock) S_LOCK(lock)

#define SpinLockRelease(lock) S_UNLOCK(lock)

#define SpinLockFree(lock)	S_LOCK_FREE(lock)


extern int	SpinlockSemas(void);
extern Size SpinlockSemaSize(void);

#ifndef HAVE_SPINLOCKS
extern void SpinlockSemaInit(void);
extern PGDLLIMPORT PGSemaphore *SpinlockSemaArray;
#endif

#endif							/* SPIN_H */
